06. 向量和 for 循环

向量和 for 循环

很多时候,你都会使用 for 循环来操纵向量。一旦你熟悉了使用带有向量的 for 循环,你就可以实现以下功能

  • 用值填充一个向量
  • 用向量进行数学运算

下面是一个程序,它可以初始化一个向量,然后使用 for 循环来填充向量的值。然后用另一个 for 循环读出向量值。

#include <iostream>
#include <vector>

using namespace std;

int main() {

    vector<float> example;

    for (int i = 0; i < 5; i++) {
        example.push_back(i*5.231);
    }

    for (int i = 0; i < example.size(); i++) {
        cout << example[i] << endl;
    }

    return 0;
}

输出如下所示:

0
5.231
10.462
15.693
20.924

使用 i++ vs. ++i

到目前为止,你已经学习了如何编写下面这样的 C++ for 循环:

for (int i = 0; i < 10; i++) {}

这条语法同 Python 的 for 循环语法十分相似;然而,你也可以这样编写 for 循环:

for (int i = 0; i < 10; ++i) {}

这两者之间有什么区别?为什么它们都可以运行?

事实上,i++ 和 ++i 都会带来同样的结果;这些都是 i=i+1 的缩写形式,它们之间的区别也十分微妙。

int i = 5;
int x = i++; // x = 5, i = 6 (called postfix)
int x = ++i; // x = 6, i = 6 (called prefix)

在两种情况中,i 变量都增加了 1。在后缀式 i++ 的情况中,先计算了int x = i,再出现了 i=i+1。

而在前缀式 ++i 的情况中,i = i + 1 先出现,再执行了 int x = i。

相比 i++,许多代码指南更推荐使用 ++i。在实际操作中,当使用整数变量时,两者的效率相同。

然而,当你编写一个重载 ++ 运算符的 C++ 类时,这两者之间又有一些差别。在 Python 矩阵项目中你见过了操作重载,其中代码重载了数学符号来进行矩阵加法、减法、乘法,等等。

重载后缀式运算符时,C++ 需要记录两个值。在例子中,记录的值是 5 和 6。而对于前缀式运算符而言,C++ 只需要记录一个值:6。因此,当重载 ++ 运算符时,使用前缀式运算符比后缀式更加高效。

重载是 C++ 的一个高阶主题,并不在本课程的讨论范围之内。如果你想了解更多相关信息,下面有一些资源:

Stackoverflow

IBM Knowledge Center

练习向量方法和 For 循环

Start Quiz:

//TODO: include the iostream and vector libraries

//TODO: Use the standard namespace

int main() {
    
    // Part 1: declare and define a vector with values
    //        {5.0, 5.0, 5.0} and print 
    //         the vector to the terminal using cout
    // Hint: the syntax vector<datatype> varname(length, value) might help

    // Part 2: Use push back to add the values 3.0, 2.5, 1.4 
    //      to the back of the vector

    // Part 3: Print out the vector again using cout

    // Part 4: Use the vector assign method to override the current vector. 
    // The overriden vector should have 3 elements with 
    // the values {5.0, 5.0, 5.0}

    // Part 5: Print out the vector

    return 0;
}
#include <iostream>
#include <vector>

using namespace std;

int main() {
    
    // Part 1: declare and define a vector {5.0, 5.0, 5.0} and print it out
    vector<float> vectorvar(3, 5.0);
    
    for (int i = 0; i < vectorvar.size(); i++) {
        cout << vectorvar[i] << " ";
    }
    
    cout << endl;
    
    // Part 2: Use push back to add the values 3.0, 2.5, 1.4 to the back of the vector
    vectorvar.push_back(3.0);
    vectorvar.push_back(2.5);
    vectorvar.push_back(1.4);
    
    // Part 3: Print out the vector
    for (int i = 0; i < vectorvar.size(); i++) {
        cout << vectorvar[i] << " ";
    }
    cout << "\n";
    
    // Part 4: Use the assign method so that the current vector has values 
    // {5.0, 5.0, 5.0}
    vectorvar.assign(3, 5.0);
    
    // Part 5: Print out the vector
    for (int i = 0; i < vectorvar.size(); i++) {
        cout << vectorvar[i] << " ";
    }
    
    cout << "\n";

    return 0;
}